import os

import celery
from celery.schedules import crontab
from django.conf import settings

# 注册环境变量（在Django项目中使用Celery需要先注册Django配置文件）
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'vote.settings')

# 创建Celery对象，指定模块名、消息代理（消息队列服务）
app = celery.Celery(
    # 模块的名字
    main='vote',
    # 消息代理（消息队列提供者）
    broker='redis://:Luohao.618@47.104.31.138:5489/0',
    # 持久化（存储异步或定时任务执行结果）
    # backend='redis://:Luohao.618@47.104.31.138:5489/1',
    backend='django-db',
)

# # 通过一个字典对象传入Celery对象的配置参数
# app.conf.update({})
# # 从Django项目的配置文件中读取Celery相关配置
# app.config_from_object('django.conf:settings')
# # 从指定的文件(例如celery_config.py)中读取Celery配置信息
# app.config_from_object('celery_config')

# 自动从指定的应用中发现任务（异步任务/定时任务）
app.autodiscover_tasks(('polls', ))
# # 自动从注册的应用中发现任务（异步任务/定时任务）
# app.autodiscover_tasks(settings.INSTALLED_APPS)

# 配置定时任务
# 定时任务是消息的生产者，需要通过下面的命令来激活定时任务
# celery -A vote beat -l debug
# 如果只有生产者没有消费者，那么消息就会积压在消息队列中
# macOS/Linux:
# celery -A vote worker -l debug
# Windows:
# pip install eventlet
# celery -A vote worker -l debug -P eventlet
app.conf.update(
    accept_content=['json', 'pickle'],
    timezone=settings.TIME_ZONE,
    enable_utc=True,
    beat_schedule={
        'work-at-11pm-friday': {
            'task': 'polls.tasks.check_inactive_users',
            'schedule': crontab(hour='2', day_of_week='6'),
        },
        'work-at-midnight': {
            'task': 'polls.tasks.reset_users_counter',
            # Linux操作系统中可以用crontab -e编辑克龙表达式
            # Linux系统的克龙表达式 ---> 分 时 日 月 周
            # Celery中的crontab构造器 ---> 分 时 周 日 月
            'schedule': crontab(minute='0', hour='0'),
        },
        'work-every-second': {
            'task': 'polls.tasks.display_info',
            'schedule': crontab(),
            'args': ('你妈喊你回家吃饭啦', 3)
        }
    },
)
